iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
Software Development

軟體架構備忘錄系列 第 22

Day 22 資料儲存 - 關聯性資料庫 (知識點110~113)

  • 分享至 

  • xImage
  •  

思考的問題

關聯性資料庫是最經典的資料儲存方式,其提供嚴謹的交易控制、彈性的資料儲存格式。
因此過去絕大部分的資料儲存都是使用關聯性資料庫。
在設計關聯性資料庫常需要考慮的包含:正規化、查詢最佳化、Sharding、Partition


正規化

描述

資料正規化是一種將資料按照其邏輯關係分別儲存於多個不同資料表的方法,以避免在多個資料表中儲存重複的資料。

使用情境

資料正規化常用於資料屬性較複雜的情況下,當單一資料表無法完整儲存所有資料時。

優點

  • 減少資料儲存量:透過正規化,減少重複性資料欄位的儲存,有效降低儲存空間需求。
  • 資料表的彈性與可擴展性較高:將資料分割為多個資料表,容易根據需求調整和擴充欄位。
  • 減少資料不一致風險:當資料發生異動時,只需要修改相應的位置,避免多處修改造成不一致的風險。

缺點

  • 複雜度:資料正規化需要管理多個資料表,相較於單一資料表,操作上更為複雜。
  • 開發成本增加:需要建立適當的資料異動介面來處理多個資料表,因此開發時間和成本會相對增加。
  • 查詢時間較長:為了獲取完整的資料,需要連結多個資料表,若未建立適當的索引,可能導致查詢時間增加。建立適當索引可以改善查詢效能。

反正規化

描述

當資料處理流程與屬性十分複雜時,過度正規化可能導致資料處理流程過於繁複,增加開發成本和維護複雜度。因此,在某些情況下,可以考慮減少正規化的設計,以簡化資料處理流程。

使用情境

  • 當資料處理流程和欄位非常複雜時,希望減少開發複雜度。

優點

  • 查詢速度提升:由於資料已經反正規化並存放在一起,可以減少關聯多個資料表的需求,加快查詢速度。
  • 控制開發複雜度:適當的反正規化可以減少所需開發的介面數量,簡化開發過程。

缺點

  • 儲存空間增加:由於存在重複性資料,需要更多的儲存空間。
  • 資料異動的複雜度和時間增加:由於需要更新多個存放相同資料的位置,因此修改資料的複雜度和時間會增加。

查詢最佳化

描述

由於資料庫通常存有大量的資料,如果查詢語句沒有經過最佳化,可能會導致查詢速度較慢,使使用者感到不滿,同時也會消耗過多的系統資源。因此,在處理大量資料時,需要關注查詢最佳化的問題。

常見作法

  • 適時建立和使用索引:建立資料索引可以加快查詢速度。但是索引的建立需要額外的儲存空間,並且查詢時依據不同的資料庫會有不同的索引選擇邏輯。若索引建立不當,可能導致查詢無法使用索引。
  • 查看SQL的執行計畫:通過查看SQL語句使用的索引和資源狀態,瞭解當前查詢的實際運行方式,有助於最佳化查詢語句。
  • 謹慎使用hint:可以使用hint指定使用索引,但需要謹慎使用此功能,因為資料庫應該能自動選擇合適的索引。
  • 建立彙總檔案:如果經常需要獲取某個彙總後的資料,可以考慮事先生成彙總檔案,以減少查詢的計算量。
  • 使用Partition, Sharding, 分頁等高級功能:根據具體需求,考慮使用分區或分頁等高級功能來最佳化查詢效率。
  • 監控和分析資料庫運行情況:監控當前耗費較多系統資源的SQL語句,並嘗試最佳化高負載的SQL查詢。

Sharding

描述

Sharding (分片) 是一種將龐大的資料表根據時間、字母、數字或Hash值等設定為shard key的方法,並使用該shard key將資料表分割儲存於多個不同的伺服器中。

使用情境

  • 當單一資料表過大且存在明確可用的Shard key時。

優點

  • 分散伺服器負載:將資料分散儲存在不同資料庫中,避免某些關鍵資料表(如商品資訊)集中在特定伺服器上造成過多系統需求。
  • 水平擴展:根據需求將資料分散儲存在多台伺服器上,提升資料庫操作速度,增加使用者滿意度。
  • 高可用性:將資料庫分散至多個伺服器,降低單點故障的風險。

缺點

  • 需謹慎設計Shard key:某些情況下,某些Shard key可能會集中過多資料,例如名人的推文。透過事先分析資料分布,可幫助設計適當的Shard key。
  • 增加join資料表的複雜度:在執行join操作時,若資料橫跨多個伺服器,查詢速度會變慢。
  • 增加伺服器管理的複雜度:需考慮資料一致性、伺服器故障恢復等問題,建置成本也較高。

Partition

描述

Partition (分割) 是將一個巨大的資料表根據時間、字母、數字或Hash值等方式設定分區鍵(Partition key),並使用該分區鍵將資料表分割並存儲於同一伺服器上的多個不同硬碟或磁碟陣列中。

使用情境

  • 當單一資料表過大且存在明確可用的分區鍵時。
  • 希望能夠在單一伺服器上分散單一資料表過大的負擔。

優點

  • 查詢效能優化:資料查詢可以分散在多個硬碟上,提升查詢效能。
  • 架構簡單:無需使用複雜的分散式多伺服器資料庫管理架構。

缺點

  • 單點故障:當單一分區或伺服器發生故障時,該分區的資料將無法存取。
  • 資料不均衡風險:若分區鍵設計不當,可能導致資料分佈不平衡,使部分硬碟處於閒置狀態。
  • 管理複雜性:需要考慮跨分區查詢、資料一致性、備份、故障恢復等議題。

上一篇
Day 21 資料儲存 - 儲存設備 (知識點104~109)
下一篇
Day 23 資料儲存 - NoSQL資料庫 (知識點114~117)
系列文
軟體架構備忘錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言